perm filename ERROR.SAI[PUB,TES] blob sn#233537 filedate 1976-08-21 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00016 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00003 00002	BEGOF("ERROR")
C00006 00003	PUBLIC SIMPLE PROCEDURE ERROR! $"#
C00007 00004	IFK CMUVER OR SAILVER THENK
C00009 00005	PUBLIC SIMPLE PROCEDURE DUSERERR $"#
C00010 00006	PUBLIC STRING SIMPLE PROCEDURE EARLYWARNING(STRING MESSG) $"#
C00011 00007	PUBLIC STRING SIMPLE PROCEDURE ERRLINE $"#
C00012 00008	PUBLIC SIMPLE PROCEDURE IMPOSSIBLE(STRING WHERE) $"#
C00013 00009	IFSITE TENEX THENK
C00015 00010	IFK ITSVER THENK COMMENT THEIR USERERR HAS 3 ARGS 
C00016 00011	PRIVATE SIMPLE INTEGER PROCEDURE NREPORT(INTEGER LOC STRING MESG, RSP) $"#
C00017 00012	PUBLIC SIMPLE INTEGER PROCEDURE REPORT (INTEGER LOC STRING MESG, RSP) $"#
C00024 00013	PUBLIC STRING SIMPLE PROCEDURE SOMEINPUT $"#
C00025 00014	PUBLIC STRING PROCEDURE TYPEIN $"#
C00026 00015	PUBLIC STRING SIMPLE PROCEDURE WARNN(REFERENCE BOOLEAN QUIETER STRING SHORT!VERSION,LONG!VERSION) $"#
C00028 00016	FINISHED
C00029 ENDMK
C⊗;
BEGOF("ERROR")
COMMENT

                *** Variations at Different Sites ***

CALLEDITOR works only if compiler-editor linkages are available, and
is different at each site.

LOSERR is used at sites with a pre-April-74 SAIL lacking the
three-argument form of USERERR.

                                 ***


Pass One Error Handler, first done sans-SAIL by Rich Johnsson.
Whenever possible, PUB and SAIL errors are trapped by the procedure
REPORT.  However, SAIL requires that REPORT be a SIMPLE PROCEDURE, so
to avoid recursion, there are times that REPORT is disabled and
NREPORT or USERERR is used instead. Furthermore, before PUB
initiallization is complete, REPORT would not work, so EARLYWARNING
(which calls USERERR) is used for errors instead of the usual WARNN
(which calls REPORT).

WARN(SHORT, LONG) puts the error message LONG on the terminal.  IF
SHORT = "=", the same message is put in the right margin in
DEBUGmode., if SHORT = NULL, no message goes in the right margin.,
else, SHORT goes in the right margin.

Actually, WARN(SHORT,LONG) is a macro which expands to
WARNN(UNIQUEOWNINTEGERVARIABLE, SHORT, LONG) so that there is a place
to remember the occurrence of "Q" and "A" responses.

;

EXTERNAL INTEGER !ERRP! ;

PROCEDURES
PUBLIC SIMPLE PROCEDURE ERROR! ;$"#
BEGIN "ERROR!"
TES 8/20/74 INTERCEPT SAIL ERRORS ;
!ERRP! ← LOCATIONOFERROR ← LOCATION(REPORT) ;
COMMENT THE VARIABLE GETS AROUND A SAIL BUG FIXED BY RHT SEP 74;
END "ERROR!" ;
IFK CMUVER OR SAILVER THENK
RKJ:	6-25-74 Do your own USERERR;

PRIVATE PROCEDURE CALLEDITOR(STRING EDNAME) ;$"#
	BEGIN TES 8/20/74 ADDED SAIL CASES ;
		JFR 8-21-76 EDFILE;
	STRING FILE;
	INTEGER LINE,PAGE;
	FILE←INCHWL;
	SETPRINT(NULL,"T"); JFR 7-30-76 CLOSE LOG FILE IF ANY;
	IF FULSTR(FILE)
	    THEN LINE←PAGE←0
	    ELSE
		BEGIN "DEFAULTFILE"
		FILE←THISFILE;
		LINE←IF EQU(EDNAME,"E") THEN CVD(SRCLINE) ELSE CVASC(SRCLINE) LOR 1;
		PAGE←CVD(SRCPAGE);
		END "DEFAULTFILE";
	EDFILE(FILE,LINE,PAGE);
	END "CALLEDITOR";
ENDC
PUBLIC SIMPLE PROCEDURE DUSERERR ;$"#
BEGIN "DUSERERR"
STRING USER!MESSG;
PASS;
USER!MESSG ← E(NULL,NULL);
IF ON THEN WARN("=",USER!MESSG);
END "DUSERERR";
PUBLIC STRING SIMPLE PROCEDURE EARLYWARNING(STRING MESSG) ;$"#
	USERERR(0,1,MESSG) ; TES 8/20/74 USED BEFORE INITIALLIZATION IS COMPLETE ;
PUBLIC STRING SIMPLE PROCEDURE ERRLINE ;$"#
	RETURN(IF EQU(MAINFILE, THISFILE) THEN SRCLINE
	       ELSE THISFILE&SP&SRCLINE) ;
PUBLIC SIMPLE PROCEDURE IMPOSSIBLE(STRING WHERE) ;$"#
	WARN("=","Impossible CASE index in " & WHERE &
		" at " & SOMEINPUT);
IFSITE TENEX THENK

PRIVATE SITE(TENEX) SIMPLE STRING PROCEDURE INCHWL ;$"#
BEGIN
STRING S ; INTEGER C ;
S ← NULL ;
DO
BEGIN
C ← PBIN ;
IF C = CTLA THEN
	IF NULSTR(S) OR EQU(S[∞-3 TO ∞], CRLF&"##") THEN
	ELSE	BEGIN
		TES 8/23/74 ↑A ECHOES ANYWAY, SO FORGET PBOUT("\") ;
		PBOUT(S[∞ FOR 1]) ;
		S ← S[1 TO ∞-1] ;
		END
ELSE IF C = CTLS THEN OUTSTR("   =" & EOL & "#" & S)
ELSE IF C = EOL OR C = ALTMODE THEN RETURN(S)
ELSE IF C = CTLV THEN S ← S & PBIN
ELSE IF C=RUBOUT THEN
	BEGIN
	OUTSTR(" XXX" & EOL & "#") ;
	S ← NULL ;
	END
ELSE IF C = LF THEN  TES 8/23/74 ;
	IF LAST<4 THEN RETURN(S)
	ELSE BEGIN OUTSTR(CR&"##") ; S ← S & (CRLF&"##") END
ELSE IF C = CTLQ THEN  TES 8/23/74 ;
	BEGIN
	OUTSTR("←"&CRLF&"#") ;
	WHILE FULSTR(S) AND NOT EQU(S[∞-3 TO ∞],CRLF&"##") DO S←S[1 TO ∞-1] ;
	IF FULSTR(S) THEN OUTSTR("#") ;
	END
ELSE S ← S & C ;
END UNTIL FALSE ;
END "INCHWL" ;

ENDC
IFK ITSVER THENK COMMENT THEIR USERERR HAS 3 ARGS ;
PRIVATE SIMPLE PROCEDURE LOSERR(INTEGER RSP) ;$"#
    BEGIN
    DEFINE !BREAK = " '45000000000" ;
    EXTERNAL INTEGER JOBSA ;

    IF RSP="X"
	THEN START!CODE !BREAK '16,'40000 END
	ELSE IF RSP="S"
	    THEN START!CODE MOVE 1,JOBSA; JRST (1) END
	    ELSE IF RSP="D" THEN START!CODE !BREAK '16,'3000000 END;
    END "LOSERR";
ENDC
PRIVATE SIMPLE INTEGER PROCEDURE NREPORT(INTEGER LOC; STRING MESG, RSP) ;$"#
	RETURN(RSP + 3 LSH 18) ; TES 8/20/74 CALLED BY REPORT  ;
PUBLIC SIMPLE INTEGER PROCEDURE REPORT (INTEGER LOC; STRING MESG, RSP) ;$"#
	BEGIN "REPORT" RKJ 6/25/74 TES 8/20/74 ;
	JFR 7-30-76 ADDED LOGGING OPTION;
	COMMENT SAIL CALLS REPORT(LOC,CRLF&MESG&CRLF,NULL),
		WARN CALLS REPORT(0,MESG,NULL|"A"),
		OTHERS CALL REPORT(0,MESG|NULL,RSP) ;
	EXTERNAL INTEGER !JBSA,!JBDDT;
	INTEGER CHAR;
	DEFINE CLRBFI= [START!CODE TTCALL '11,0 END];
	BOOLEAN LOGGING; STRING LOGSTR;

		SIMPLE PROCEDURE OUTLOG(STRING MESG); BEGIN "OUTLOG"
		COMMENT necessary because message is typed before "L" response;
		LOGSTR←LOGSTR & MESG;
		OUTSTR(MESG) END "OUTLOG";

	IF LOC=0 AND NOT SWDBACK THEN OUTLOG(CRLF) ; SWDBACK←TRUE;
	IF FULSTR(MESG) THEN BEGIN OUTLOG(MESG); IF LOC=0 THEN OUTLOG(CRLF) END ;
	IF NOT ERRLF THEN
	    IF (CHAR←INCHRS)=LF
		THEN ERRLF←TRUE;
	IF LOC THEN OUTLOG(
	    "This is a SAIL error - Probably a PUB bug. Called from location "&CVOS(RH(LOC))&CRLF) ;
	IF NOT ON THEN OUTLOG("In the false part of a conditional"&CRLF) ;
	OUTLOG("Line/Page "&ERRLINE&"/"&SRCPAGE&"["&MACLINE&"]"&CRLF) ;
	CHAR ← RSP ;
	IF NOT ERRLF THEN
	WHILE TRUE DO
	    BEGIN "ERRLOOP"
	    IF NOT CHAR THEN
		    BEGIN
		    OUTCHR("↑");
		    IFC TENEX THENC CLRBUF ELSEC CLRBFI ENDC ;
		    CHAR ← INCHRW ;
		    IF "a" LEQ CHAR LEQ "z" THEN CHAR ← CHAR LAND '137 ;
		    END ;
	    IF CHAR=CR THEN BEGIN INCHWL; CHAR←0; DONE END ELSE
	    IF CHAR="C" OR CHAR='37 THEN BEGIN CHAR←0; DONE END ELSE
	    IF CHAR=LF THEN BEGIN ERRLF←TRUE; CHAR←0; DONE END ELSE
	    IF CHAR="L" THEN BEGIN
		IF LOGGING THEN OUTSTR("ALREADY") ELSE
		SETPRINT(OUTFILE & ".LOG", "F");
		OUTSTR(" LOGGING " & OUTFILE & ".LOG");
		LOGGING←TRUE; CHAR←0 END ELSE
	    IF CHAR="X" THEN DONE ELSE
	    IF CHAR="S" THEN DONE ELSE
	    IF CHAR="D" THEN
		IFC TENEX THENC DONE ELSE ELSEC
		BEGIN
		IF !JBDDT NEQ 0
		    THEN DONE
		    ELSE OUTSTR(CRLF&"No DDT"&CRLF);
		END ELSE
		ENDC
	    IFC SAILVER OR CMUVER THENC
	    IF CHAR="E" THEN CALLEDITOR(IFC SAILVER THENC "SOS" ELSEC "LINED" ENDC) ELSE
	    ENDC
	    IFC SAILVER THENC
	    IF CHAR="T" THEN CALLEDITOR("E") ELSE
	    ENDC
	    IF CHAR="P" THEN
		    BEGIN TES: PUB INTERACTIVE DEBUGGER ;
		    INTEGER LASTWAS, TEXTWAS, BRCWAS, ONWAS ;
		    LASTWAS←LAST ; TEXTWAS←TEXTMODE ; ONWAS←ON ; ON←TRUE ;
		    OUTSTR(CRLF&"= = = = ="&CRLF) ;
		    !ERRP! ← 0 ; COMMENT PREVENT RECURSION ;
		    SWICH("START PUB!DEBUG END;;" &
			(IF NOT TEXTMODE THEN CRLF&TB&TB
			 ELSE RCBRAK), -1, 0) ; TES 8/23/74;
		    TEXTMODE ← 0 ; TES 8/23/74 ;
		    PASS ; STATEMENT ;
		    !ERRP! ← LOCATIONOFERROR ;
		    OUTSTR("= = = = ="&CRLF) ;
		    ON ← ONWAS ;
		    IF TEXTWAS THEN
			BEGIN
			WHILE LAST>LASTWAS DO SWICHBACK ;
			EMPTYTHIS ; EMPTYTHAT ;
			TEXTMODE ← TRUE ; BRC ← BRCWAS ;
			END ;
		    END
	    ELSE
	    IF CHAR = "Q" AND NOT LOC THEN
		BEGIN LOC←TRUE; OUTLOG(CRLF) ; DONE END ELSE
	    IF CHAR = "A" AND NOT LOC THEN
		BEGIN
		LOC←TRUE;
		OUTLOG(IF RSP="A" THEN "AUTO-CONTINUE"&CRLF ELSE CRLF) ;
		DONE ;
		END ELSE
	    IF CHAR = "?" THEN
	    BEGIN
	    OUTSTR("Reply" & CRLF &
		"<CR> to continue," & CRLF &
		"<LF> to continue automatically from all messages," & CRLF &
		"""A"" to continue automatically from this message,"& CRLF &
		"""Q"" to quiet this message," & CRLF &
		"""P"" to enter PUB debug loop, " & CRLF
		);
	    IFC NOT TENEX THENC IF !JBDDT NEQ 0 THEN ENDC
		OUTSTR("""D"" to enter DDT, ") ; 
	    OUTSTR(
	    IFC SAILVER THENC
	    """E"" or ""T"" to EDIT, "&
	    ELSEC
	    IFC PARCVER THENC
	    """E"" to EDIT, "&
	    ENDC ENDC
	    IFC NOT(ITSVER) THENC
		"""L"" to log errors, " & ENDC
		"""X"" to exit, ""S"" to start over"&CRLF);
	    END ELSE OUTSTR("	? FOR HELP"&CRLF) ;
	    CHAR ← 0 ;
	    END "ERRLOOP" ;
	IF LOGGING THEN PRINT(LOGSTR); LOGSTR←NULL;
	IF LOC OR NOT CHAR THEN RETURN(CHAR + 3 LSH 18)
	ELSE	BEGIN "BUGGY"
		!ERRP! ← LOCATION(NREPORT) ; COMMENT SIMPLE PROCEDURES CAN'T RECURSE ;
		IFC ITSVER THENC
		LOSERR(CHAR) ;
		ELSEC
		USERERR(0, 1, NULL, CHAR) ;
		ENDC
		!ERRP! ← LOCATIONOFERROR ;
		RETURN(0) ;
		END "BUGGY" ;
	END "REPORT";
PUBLIC STRING SIMPLE PROCEDURE SOMEINPUT ;$"#
	RETURN(SP&THISWD&SP&
	   (IF THATISFULL THEN LIT!ENTITY&LIT!TRAIL ELSE NULL)&INPUTSTR[1 TO 80]);
PUBLIC STRING PROCEDURE TYPEIN ;$"#
	BEGIN
	RKJ: 6-FEB-75 MODS FOR AUTOCRLF;
	IF NOT ON THEN RETURN (NULL);  RKJ: 5-10-74 ;
	IF (NOT SWDBACK) AND AUTOCRLF THEN BEGIN  OUTSTR(CRLF) ;  SWDBACK ← TRUE END ;
	IF AUTOCRLF THEN OUTSTR("#") ;
	RETURN(INCHWL) ;
	END "TYPEIN" ;
PUBLIC STRING SIMPLE PROCEDURE WARNN(REFERENCE BOOLEAN QUIETER; STRING SHORT!VERSION,LONG!VERSION) ;$"#
BEGIN "WARN"
COMMENT USUALLY CALLED BY WARN(SHORT, LONG) -- DEFINED AS:
	BEGIN OWN INTEGER <NEWNAME> ., WARNN(<NEWNAME>, SHORT, LONG) END ;
COMMENT MAYBE THERE WAS A "Q" RESPONSE BEFORE ;
IF QUIETER="Q" OR NULSTR(LONG!VERSION) THEN
ELSE IF !ERRP! THEN QUIETER ← RH(REPORT(0, LONG!VERSION, QUIETER))
ELSE USERERR(0, 1, LONG!VERSION) ; COMMENT PREVENT RECURSION ;
IF DEBUG AND MESGS<MESSMAX AND FULSTR(SHORT!VERSION) THEN
	MESGSARR[MESGS←MESGS+1] ← IF SHORT!VERSION = "=" THEN LONG!VERSION ELSE SHORT!VERSION ;
RETURN(NULL) ;
END "WARN" ;
FINISHED

ENDOF("ERROR")